home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / hash / md4.txt < prev    next >
Text File  |  1993-07-23  |  30KB  |  868 lines

  1. The following version of MD4 was taken from sci.crypt.  It was
  2. originally posted in two parts: the code and an appendix.  Both
  3. are included here.
  4. -------------------------------------------------------------------
  5. ___________________________________________________________________
  6. License to copy and use this document and the software described
  7. herein is granted provided it is identified as the "RSA Data
  8. Security, Inc. MD4 Message Digest Algorithm" in all materials
  9. mentioning or referencing this software, function, or document.
  10.  
  11. License is also granted to make derivative works provided that such
  12. works are identified as "derived from the RSA Data Security, Inc. MD4
  13. Message Digest Algorithm" in all material mentioning or referencing
  14. the derived work.
  15.  
  16. RSA Data Security, Inc. makes no representations concerning the
  17. merchantability of this algorithm or software or their suitability
  18. for any specific purpose.  It is provided "as is" without express or
  19. implied warranty of any kind.
  20.  
  21. These notices must be retained in any copies of any part of this
  22. documentation and/or software.
  23.  
  24. APPENDIX. Reference Implementation
  25. ----------------------------------
  26.  
  27. This appendix contains the following files:
  28.     md4.h        -- a header file for using the MD4 implementation
  29.     md4.c        -- the source code for the MD4 routines
  30.     md4driver.c    -- a sample ``user'' routine
  31.     session        -- sample results of running md4driver
  32.  
  33. /* 
  34. ** **************************************************************************
  35. ** md4.h -- Header file for implementation of MD4 Message Digest Algorithm **
  36. ** Updated: 2/13/90 by Ronald L. Rivest                                    **
  37. ** (C) 1990 RSA Data Security, Inc.                                        **
  38. ** **************************************************************************
  39. */
  40.  
  41. /* MDstruct is the data structure for a message digest computation.
  42. */
  43. typedef struct {
  44.   unsigned int buffer[4];    /* Holds 4-word result of MD computation */
  45.   unsigned char count[8];    /* Number of bits processed so far */
  46.   unsigned int done;         /* Nonzero means MD computation finished */
  47. } MDstruct, *MDptr;
  48.  
  49. /* MDbegin(MD)
  50. ** Input: MD -- an MDptr
  51. ** Initialize the MDstruct prepatory to doing a message digest computation.
  52. */
  53. extern void MDbegin();
  54.  
  55. /* MDupdate(MD,X,count)
  56. ** Input: MD -- an MDptr
  57. **        X -- a pointer to an array of unsigned characters.
  58. **        count -- the number of bits of X to use (an unsigned int).
  59. ** Updates MD using the first ``count'' bits of X.
  60. ** The array pointed to by X is not modified.
  61. ** If count is not a multiple of 8, MDupdate uses high bits of last byte.
  62. ** This is the basic input routine for a user.
  63. ** The routine terminates the MD computation when count < 512, so
  64. ** every MD computation should end with one call to MDupdate with a
  65. ** count less than 512.  Zero is OK for a count.
  66. */
  67. extern void MDupdate();
  68.  
  69. /* MDprint(MD)
  70. ** Input: MD -- an MDptr
  71. ** Prints message digest buffer MD as 32 hexadecimal digits.
  72. ** Order is from low-order byte of buffer[0] to high-order byte of buffer[3].
  73. ** Each byte is printed with high-order hexadecimal digit first.
  74. */
  75. extern void MDprint();      
  76.  
  77. /* 
  78. ** End of md4.h
  79. ****************************(cut)*****************************************/
  80.  
  81. /* 
  82. ** **************************************************************************
  83. ** md4.c -- Implementation of MD4 Message Digest Algorithm                 **
  84. ** Updated: 2/16/90 by Ronald L. Rivest                                    **
  85. ** (C) 1990 RSA Data Security, Inc.                                        **
  86. ** **************************************************************************
  87. */
  88.  
  89. /* 
  90. ** To use MD4:
  91. **   -- Include md4.h in your program
  92. **   -- Declare an MDstruct MD to hold the state of the digest computation.
  93. **   -- Initialize MD using MDbegin(&MD)
  94. **   -- For each full block (64 bytes) X you wish to process, call
  95. **          MDupdate(&MD,X,512)
  96. **      (512 is the number of bits in a full block.)
  97. **   -- For the last block (less than 64 bytes) you wish to process,
  98. **          MDupdate(&MD,X,n)
  99. **      where n is the number of bits in the partial block. A partial
  100. **      block terminates the computation, so every MD computation should
  101. **      terminate by processing a partial block, even if it has n = 0.
  102. **   -- The message digest is available in MD.buffer[0] ... MD.buffer[3].
  103. **      (Least-significant byte of each word should be output first.)
  104. **   -- You can print out the digest using MDprint(&MD)
  105. */
  106.  
  107. /* Implementation notes:
  108. ** This implementation assumes that ints are 32-bit quantities.
  109. ** If the machine stores the least-significant byte of an int in the
  110. ** least-addressed byte (eg., VAX and 8086), then LOWBYTEFIRST should be
  111. ** set to TRUE.  Otherwise (eg., SUNS), LOWBYTEFIRST should be set to
  112. ** FALSE.  Note that on machines with LOWBYTEFIRST FALSE the routine
  113. ** MDupdate modifies has a side-effect on its input array (the order of bytes
  114. ** in each word are reversed).  If this is undesired a call to MDreverse(X) can
  115. ** reverse the bytes of X back into order after each call to MDupdate.
  116. */
  117. #define TRUE  1
  118. #define FALSE 0
  119. #define LOWBYTEFIRST FALSE 
  120.  
  121. /* Compile-time includes 
  122. */
  123. #include <stdio.h>
  124. #include "md4.h"
  125.  
  126. /* Compile-time declarations of MD4 ``magic constants''.
  127. */
  128. #define I0  0x67452301       /* Initial values for MD buffer */
  129. #define I1  0xefcdab89
  130. #define I2  0x98badcfe
  131. #define I3  0x10325476
  132. #define C2  013240474631     /* round 2 constant = sqrt(2) in octal */
  133. #define C3  015666365641     /* round 3 constant = sqrt(3) in octal */
  134. /* C2 and C3 are from Knuth, The Art of Programming, Volume 2
  135. ** (Seminumerical Algorithms), Second Edition (1981), Addison-Wesley.
  136. ** Table 2, page 660.
  137. */
  138. #define fs1  3               /* round 1 shift amounts */
  139. #define fs2  7   
  140. #define fs3 11  
  141. #define fs4 19  
  142. #define gs1  3               /* round 2 shift amounts */
  143. #define gs2  5   
  144. #define gs3  9   
  145. #define gs4 13  
  146. #define hs1  3               /* round 3 shift amounts */
  147. #define hs2  9 
  148. #define hs3 11 
  149. #define hs4 15
  150.  
  151.  
  152. /* Compile-time macro declarations for MD4.
  153. ** Note: The ``rot'' operator uses the variable ``tmp''.
  154. ** It assumes tmp is declared as unsigned int, so that the >>
  155. ** operator will shift in zeros rather than extending the sign bit.
  156. */
  157. #define    f(X,Y,Z)             ((X&Y) | ((~X)&Z))
  158. #define    g(X,Y,Z)             ((X&Y) | (X&Z) | (Y&Z))
  159. #define h(X,Y,Z)             (X^Y^Z)
  160. #define rot(X,S)             (tmp=X,(tmp<<S) | (tmp>>(32-S)))
  161. #define ff(A,B,C,D,i,s)      A = rot((A + f(B,C,D) + X[i]),s)
  162. #define gg(A,B,C,D,i,s)      A = rot((A + g(B,C,D) + X[i] + C2),s)
  163. #define hh(A,B,C,D,i,s)      A = rot((A + h(B,C,D) + X[i] + C3),s)
  164.  
  165. /* MDprint(MDp)
  166. ** Print message digest buffer MDp as 32 hexadecimal digits.
  167. ** Order is from low-order byte of buffer[0] to high-order byte of buffer[3].
  168. ** Each byte is printed with high-order hexadecimal digit first.
  169. ** This is a user-callable routine.
  170. */
  171. void 
  172. MDprint(MDp)
  173. MDptr MDp;
  174. { int i,j;
  175.   for (i=0;i<4;i++)
  176.     for (j=0;j<32;j=j+8)
  177.       printf("%02x",(MDp->buffer[i]>>j) & 0xFF);
  178. }
  179.  
  180. /* MDbegin(MDp)
  181. ** Initialize message digest buffer MDp. 
  182. ** This is a user-callable routine.
  183. */
  184. void 
  185. MDbegin(MDp)
  186. MDptr MDp;
  187. { int i;
  188.   MDp->buffer[0] = I0;  
  189.   MDp->buffer[1] = I1;  
  190.   MDp->buffer[2] = I2;  
  191.   MDp->buffer[3] = I3; 
  192.   for (i=0;i<8;i++) MDp->count[i] = 0;
  193.   MDp->done = 0;
  194. }
  195.  
  196. /* MDreverse(X)
  197. ** Reverse the byte-ordering of every int in X.
  198. ** Assumes X is an array of 16 ints.
  199. ** The macro revx reverses the byte-ordering of the next word of X.
  200. */
  201. #define revx { t = (*X << 16) | (*X >> 16); \
  202.            *X++ = ((t & 0xFF00FF00) >> 8) | ((t & 0x00FF00FF) << 8); }
  203. MDreverse(X)
  204. unsigned int *X;
  205. { register unsigned int t;
  206.   revx; revx; revx; revx; revx; revx; revx; revx;
  207.   revx; revx; revx; revx; revx; revx; revx; revx;
  208. }
  209.  
  210. /* MDblock(MDp,X)
  211. ** Update message digest buffer MDp->buffer using 16-word data block X.
  212. ** Assumes all 16 words of X are full of data.
  213. ** Does not update MDp->count.
  214. ** This routine is not user-callable. 
  215. */
  216. static void
  217. MDblock(MDp,X)
  218. MDptr MDp;
  219. unsigned int *X;
  220.   register unsigned int tmp, A, B, C, D;
  221. #if LOWBYTEFIRST == FALSE
  222.   MDreverse(X);
  223. #endif
  224.   A = MDp->buffer[0];
  225.   B = MDp->buffer[1];
  226.   C = MDp->buffer[2];
  227.   D = MDp->buffer[3];
  228.   /* Update the message digest buffer */
  229.   ff(A , B , C , D ,  0 , fs1); /* Round 1 */
  230.   ff(D , A , B , C ,  1 , fs2); 
  231.   ff(C , D , A , B ,  2 , fs3); 
  232.   ff(B , C , D , A ,  3 , fs4); 
  233.   ff(A , B , C , D ,  4 , fs1); 
  234.   ff(D , A , B , C ,  5 , fs2); 
  235.   ff(C , D , A , B ,  6 , fs3); 
  236.   ff(B , C , D , A ,  7 , fs4); 
  237.   ff(A , B , C , D ,  8 , fs1); 
  238.   ff(D , A , B , C ,  9 , fs2); 
  239.   ff(C , D , A , B , 10 , fs3); 
  240.   ff(B , C , D , A , 11 , fs4); 
  241.   ff(A , B , C , D , 12 , fs1); 
  242.   ff(D , A , B , C , 13 , fs2); 
  243.   ff(C , D , A , B , 14 , fs3); 
  244.   ff(B , C , D , A , 15 , fs4); 
  245.   gg(A , B , C , D ,  0 , gs1); /* Round 2 */
  246.   gg(D , A , B , C ,  4 , gs2); 
  247.   gg(C , D , A , B ,  8 , gs3); 
  248.   gg(B , C , D , A , 12 , gs4); 
  249.   gg(A , B , C , D ,  1 , gs1); 
  250.   gg(D , A , B , C ,  5 , gs2); 
  251.   gg(C , D , A , B ,  9 , gs3); 
  252.   gg(B , C , D , A , 13 , gs4); 
  253.   gg(A , B , C , D ,  2 , gs1); 
  254.   gg(D , A , B , C ,  6 , gs2); 
  255.   gg(C , D , A , B , 10 , gs3); 
  256.   gg(B , C , D , A , 14 , gs4); 
  257.   gg(A , B , C , D ,  3 , gs1); 
  258.   gg(D , A , B , C ,  7 , gs2); 
  259.   gg(C , D , A , B , 11 , gs3); 
  260.   gg(B , C , D , A , 15 , gs4);  
  261.   hh(A , B , C , D ,  0 , hs1); /* Round 3 */
  262.   hh(D , A , B , C ,  8 , hs2); 
  263.   hh(C , D , A , B ,  4 , hs3); 
  264.   hh(B , C , D , A , 12 , hs4); 
  265.   hh(A , B , C , D ,  2 , hs1); 
  266.   hh(D , A , B , C , 10 , hs2); 
  267.   hh(C , D , A , B ,  6 , hs3); 
  268.   hh(B , C , D , A , 14 , hs4); 
  269.   hh(A , B , C , D ,  1 , hs1); 
  270.   hh(D , A , B , C ,  9 , hs2); 
  271.   hh(C , D , A , B ,  5 , hs3); 
  272.   hh(B , C , D , A , 13 , hs4); 
  273.   hh(A , B , C , D ,  3 , hs1); 
  274.   hh(D , A , B , C , 11 , hs2); 
  275.   hh(C , D , A , B ,  7 , hs3); 
  276.   hh(B , C , D , A , 15 , hs4);
  277.   MDp->buffer[0] += A; 
  278.   MDp->buffer[1] += B;
  279.   MDp->buffer[2] += C;
  280.   MDp->buffer[3] += D; 
  281. }
  282.  
  283. /* MDupdate(MDp,X,count)
  284. ** Input: MDp -- an MDptr
  285. **        X -- a pointer to an array of unsigned characters.
  286. **        count -- the number of bits of X to use.
  287. **                 (if not a multiple of 8, uses high bits of last byte.)
  288. ** Update MDp using the number of bits of X given by count.
  289. ** This is the basic input routine for an MD4 user.
  290. ** The routine completes the MD computation when count < 512, so
  291. ** every MD computation should end with one call to MDupdate with a
  292. ** count less than 512.  A call with count 0 will be ignored if the
  293. ** MD has already been terminated (done != 0), so an extra call with count
  294. ** 0 can be given as a ``courtesy close'' to force termination if desired.
  295. */
  296. void 
  297. MDupdate(MDp,X,count)
  298. MDptr MDp;
  299. unsigned char *X;
  300. unsigned int count;
  301. { unsigned int i, tmp, bit, byte, mask;
  302.   unsigned char XX[64];
  303.   unsigned char *p;
  304.   /* return with no error if this is a courtesy close with count
  305.   ** zero and MDp->done is true.
  306.   */
  307.   if (count == 0 && MDp->done) return;
  308.   /* check to see if MD is already done and report error */
  309.   if (MDp->done) { printf("\nError: MDupdate MD already done."); return; }
  310.   /* Add count to MDp->count */
  311.   tmp = count;
  312.   p = MDp->count;
  313.   while (tmp)
  314.     { tmp += *p;
  315.       *p++ = tmp;
  316.       tmp = tmp >> 8;
  317.     }
  318.   /* Process data */
  319.   if (count == 512) 
  320.     { /* Full block of data to handle */
  321.       MDblock(MDp,(unsigned int *)X);
  322.     }
  323.   else if (count > 512) /* Check for count too large */
  324.     { printf("\nError: MDupdate called with illegal count value %d.",count);
  325.       return;
  326.     }
  327.   else /* partial block -- must be last block so finish up */
  328.     { /* Find out how many bytes and residual bits there are */
  329.       byte = count >> 3;
  330.       bit =  count & 7;
  331.       /* Copy X into XX since we need to modify it */
  332.       for (i=0;i<=byte;i++)   XX[i] = X[i];
  333.       for (i=byte+1;i<64;i++) XX[i] = 0;
  334.       /* Add padding '1' bit and low-order zeros in last byte */
  335.       mask = 1 << (7 - bit);
  336.       XX[byte] = (XX[byte] | mask) & ~( mask - 1);
  337.       /* If room for bit count, finish up with this block */
  338.       if (byte <= 55)
  339.     { for (i=0;i<8;i++) XX[56+i] = MDp->count[i];
  340.       MDblock(MDp,(unsigned int *)XX);
  341.     }
  342.       else /* need to do two blocks to finish up */
  343.     { MDblock(MDp,(unsigned int *)XX);
  344.       for (i=0;i<56;i++) XX[i] = 0;
  345.       for (i=0;i<8;i++)  XX[56+i] = MDp->count[i];
  346.       MDblock(MDp,(unsigned int *)XX);
  347.     }
  348.       /* Set flag saying we're done with MD computation */
  349.       MDp->done = 1;
  350.     }
  351. }
  352.  
  353. /* 
  354. ** End of md4.c
  355. ****************************(cut)*****************************************/
  356.  
  357. /* 
  358. ** **************************************************************************
  359. ** md4driver.c -- sample routines to test MD4 message digest algorithm.    **
  360. ** Updated: 2/16/90 by Ronald L. Rivest                                    **
  361. ** (C) 1990 RSA Data Security, Inc.                                        **
  362. ** **************************************************************************
  363. */
  364.  
  365. #include <stdio.h>
  366. #include "md4.h"
  367.  
  368. /* MDtimetrial()
  369. ** A time trial routine, to measure the speed of MD4.
  370. ** Measures speed for 1M blocks = 64M bytes.
  371. */
  372. MDtimetrial()
  373. { unsigned int X[16];
  374.   MDstruct MD;
  375.   int i;
  376.   double t;
  377.   for (i=0;i<16;i++) X[i] = 0x01234567 + i;
  378.   printf("MD4 time trial. Processing 1 million 64-character blocks...\n");
  379.   clock();
  380.   MDbegin(&MD);
  381.   for (i=0;i<1000000;i++) MDupdate(&MD,X,512);
  382.   MDupdate(&MD,X,0);
  383.   t = (double) clock(); /* in microseconds */
  384.   MDprint(&MD); printf(" is digest of 64M byte test input.\n");
  385.   printf("Seconds to process test input:   %g\n",t/1e6);
  386.   printf("Characters processed per second: %ld.\n",(int)(64e12/t));
  387. }
  388.  
  389. /* MDstring(s)
  390. ** Computes the message digest for string s.
  391. ** Prints out message digest, a space, the string (in quotes) and a carriage
  392. ** return.
  393. */
  394. MDstring(s)
  395. unsigned char *s;
  396. { unsigned int i, len = strlen(s);
  397.   MDstruct MD;
  398.   MDbegin(&MD);
  399.   for (i=0;i+64<=len;i=i+64) MDupdate(&MD,s+i,512);
  400.   MDupdate(&MD,s+i,(len-i)*8);
  401.   MDprint(&MD);
  402.   printf(" \"%s\"\n",s);
  403. }
  404.  
  405. /* MDfile(filename)
  406. ** Computes the message digest for a specified file.
  407. ** Prints out message digest, a space, the file name, and a carriage return.
  408. */
  409. MDfile(filename)
  410. char *filename;
  411. { FILE *f = fopen(filename,"rb");
  412.   unsigned char X[64];
  413.   MDstruct MD;
  414.   int b;
  415.   if (f == NULL) { printf("%s can't be opened.\n",filename); return; }
  416.   MDbegin(&MD);
  417.   while ((b=fread(X,1,64,f))!=0) MDupdate(&MD,X,b*8);
  418.   MDupdate(&MD,X,0);
  419.   MDprint(&MD);
  420.   printf(" %s\n",filename);
  421.   fclose(f);
  422. }
  423.  
  424. /* MDfilter()
  425. ** Writes the message digest of the data from stdin onto stdout, followed
  426. ** by a carriage return.
  427. */
  428. MDfilter()
  429. { unsigned char X[64];
  430.   MDstruct MD;
  431.   int b;
  432.   MDbegin(&MD);
  433.   while ((b=fread(X,1,64,stdin))!=0) MDupdate(&MD,X,b*8);
  434.   MDupdate(&MD,X,0);
  435.   MDprint(&MD);
  436.   printf("\n");
  437. }
  438.  
  439. /* MDtestsuite()
  440. ** Run a standard suite of test data.
  441. */
  442. MDtestsuite()
  443. {
  444.   printf("MD4 test suite results:\n");
  445.   MDstring("");
  446.   MDstring("a");
  447.   MDstring("abc");
  448.   MDstring("message digest");
  449.   MDstring("abcdefghijklmnopqrstuvwxyz");
  450.   MDstring("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
  451.   MDfile("foo"); /* Contents of file foo are "abc" */
  452. }
  453.  
  454. main(argc,argv)
  455. int argc;
  456. char *argv[];
  457. { int i;
  458.   /* For each command line argument in turn:
  459.   ** filename             -- prints message digest and name of file
  460.   ** -sstring             -- prints message digest and contents of string
  461.   ** -t                   -- prints time trial statistics for 64M bytes
  462.   ** -x                   -- execute a standard suite of test data
  463.   ** (no args)            -- writes messages digest of stdin onto stdout
  464.   */
  465.   if (argc==1) MDfilter();
  466.   else
  467.     for (i=1;i<argc;i++)
  468.       if (argv[i][0]=='-' && argv[i][1]=='s') MDstring(argv[i]+2);
  469.       else if (strcmp(argv[i],"-t")==0)       MDtimetrial();
  470.       else if (strcmp(argv[i],"-x")==0)       MDtestsuite();
  471.       else                                    MDfile(argv[i]);
  472. }
  473.  
  474. /*
  475. ** end of md4driver.c
  476. ****************************(cut)*****************************************/
  477.  
  478.  
  479. --------------------------------------------------------------------------
  480. ---- Sample session.  Compiling and using MD4 on SUN Sparcstation --------
  481. --------------------------------------------------------------------------
  482. >ls
  483. total 66
  484. -rw-rw-r--  1 rivest          3 Feb 14 17:40 abcfile
  485. -rwxrwxr-x  1 rivest      24576 Feb 17 12:28 md4
  486. -rw-rw-r--  1 rivest       9347 Feb 17 00:37 md4.c
  487. -rw-rw-r--  1 rivest      25150 Feb 17 12:25 md4.doc
  488. -rw-rw-r--  1 rivest       1844 Feb 16 21:21 md4.h
  489. -rw-rw-r--  1 rivest       3497 Feb 17 12:27 md4driver.c
  490. >
  491. >cc -o md4 -O4 md4.c md4driver.c
  492. md4.c:
  493. md4driver.c:
  494. Linking:
  495. >
  496. >md4 -x
  497. MD4 test suite results:
  498. 31d6cfe0d16ae931b73c59d7e0c089c0 ""
  499. bde52cb31de33e46245e05fbdbd6fb24 "a"
  500. a448017aaf21d8525fc10ae87aa6729d "abc"
  501. d9130a8164549fe818874806e1c7014b "message digest"
  502. d79e1c308aa5bbcdeea8ed63df412da9 "abcdefghijklmnopqrstuvwxyz"
  503. 043f8582f241db351ce627e153e7f0e4 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
  504. a448017aaf21d8525fc10ae87aa6729d abcfile
  505. >
  506. >md4 -sabc -shi
  507. a448017aaf21d8525fc10ae87aa6729d "abc"
  508. cfaee2512bd25eb033236f0cd054e308 "hi"
  509. >
  510. >md4 *
  511. a448017aaf21d8525fc10ae87aa6729d abcfile
  512. d316f994da0e951cf9502928a1f73300 md4
  513. 379adb39eada0dfdbbdfdcd0d9def8c4 md4.c
  514. 9a3f73327c65954198b1f45a3aa12665 md4.doc
  515. 37fe165ac177b461ff78b86d10e4ff33 md4.h
  516. 7dcba2e2dc4d8f1408d08beb17dabb2a md4.o
  517. 08790161bfddc6f5788b4353875cb1c3 md4driver.c
  518. 1f84a7f690b0545d2d0480d5d3c26eea md4driver.o
  519. >
  520. >cat abcfile | md4
  521. a448017aaf21d8525fc10ae87aa6729d
  522. >
  523. >md4 -t
  524. MD4 time trial. Processing 1 million 64-character blocks...
  525. 6325bf77e5891c7c0d8104b64cc6e9ef is digest of 64M byte test input.
  526. Seconds to process test input:   44.0982
  527. Characters processed per second: 1451305.
  528. >
  529. >
  530. ------------------------ end of sample session --------------------------
  531.  
  532. ------------------------------------------------------------------------
  533. ------------------------------------------------------------------------
  534. ------------------------------------------------------------------------
  535. (end of document)
  536.  
  537. From sci.crypt Tue Mar 20 16:02:29 1990
  538. Path: roo!arisia!bionet!uwm.edu!zaphod.mps.ohio-state.edu!tut.cis.ohio-state.edu!ucbvax!hplabs!well!rsa
  539. From: rsa@well.sf.ca.us (RSA Data Security)
  540. Newsgroups: sci.crypt
  541. Subject: MD4 message digest - text
  542. Keywords: message digest, fingerprint, hash, digital signature, cryptography
  543. Message-ID: <16774@well.sf.ca.us>
  544. Date: 20 Mar 90 18:23:32 GMT
  545. Distribution: sci
  546. Lines: 318
  547.  
  548. ___________________________________________________________________
  549. License to copy and use this document and the software described
  550. herein is granted provided it is identified as the "RSA Data
  551. Security, Inc. MD4 Message Digest Algorithm" in all materials
  552. mentioning or referencing this software, function, or document.
  553.  
  554. License is also granted to make derivative works provided that such
  555. works are identified as "derived from the RSA Data Security, Inc. MD4
  556. Message Digest Algorithm" in all material mentioning or referencing
  557. the derived work.
  558.  
  559. RSA Data Security, Inc. makes no representations concerning the
  560. merchantability of this algorithm or software or their suitability
  561. for any specific purpose.  It is provided "as is" without express or
  562. implied warranty of any kind.
  563.  
  564. These notices must be retained in any copies of any part of this
  565. documentation and/or software.
  566.  
  567.  
  568.          The MD4 Message Digest Algorithm
  569.          --------------------------------
  570.             by Ronald L. Rivest
  571.     MIT Laboratory for Computer Science, Cambridge, Mass. 02139
  572.                 and
  573.     RSA Data Security, Inc., Redwood City, California 94065
  574.             (Version 2/17/90 -- Revised)
  575.  
  576.  
  577. Abstract:
  578. ---------
  579.                 
  580. This note describes the MD4 message digest algorithm.  The algorithm
  581. takes as input an input message of arbitrary length and produces as
  582. output a 128-bit ``fingerprint'' or ``message digest'' of the input.
  583. It is conjectured that it is computationally infeasible to produce two
  584. messages having the same message digest, or to produce any message
  585. having a given prespecified target message digest.  The MD4 algorithm
  586. is thus ideal for digital signature applications, where a large file
  587. must be ``compressed'' in a secure manner before being signed with the
  588. RSA public-key cryptosystem.
  589.  
  590. The MD4 algorithm is designed to be quite fast on 32-bit machines.  On
  591. a SUN Sparc station, MD4 runs at 1,450,000 bytes/second.  On a DEC
  592. MicroVax II, MD4 runs at approximately 70,000 bytes/second.  On a 20MHz
  593. 80286, MD4 runs at approximately 32,000 bytes/second.  In addition, the
  594. MD4 algorithm does not require any large substitution tables; the
  595. algorithm can be coded quite compactly.
  596.  
  597. The MD4 algorithm is being placed in the public domain for review and
  598. possible adoption as a standard.  
  599.  
  600. (Note: The document supersedes an earlier draft.  The algorithm described
  601.        here is a slight modification of the one described in the draft.)
  602.  
  603.  
  604. I. Terminology and Notation
  605. ---------------------------
  606.  
  607. In this note a ``word'' is a 32-bit quantity and a byte is an 8-byte
  608. quantity.  A sequence of bits can be interpreted in a natural manner
  609. as a sequence of bytes, where each consecutive group of 8 bits is
  610. interpreted as a byte with the high-order (most significant) bit of
  611. each byte listed first.  Similarly, a sequence of bytes can be
  612. interpreted as a sequence of 32-bit words, where each consecutive
  613. group of 4 bytes is interpreted as a word with the low-order (least
  614. significant) byte given first.
  615.  
  616. Let x_i denote ``x sub i''.  If the subscript is an expression, we
  617. surround it in braces, as in x_{i+1}.  Similarly, we use ^ for
  618. superscripts (exponentiation), so that x^i denotes x to the i-th
  619. power.
  620.  
  621. Let the symbol ``+'' denote addition of words (i.e., modulo-2^32
  622. addition). Let X <<< s denote the 32-bit value obtained by circularly
  623. shifting (rotating) X left by s bit positions.  Let not(X) denote the
  624. bit-wise complement of X, and let X v Y denote the bit-wise OR of X
  625. and Y.  Let X xor Y denote the bit-wise XOR of X and Y, and let XY
  626. denote the bit-wise AND of X and Y.
  627.  
  628.  
  629. II. MD4 Algorithm Description
  630. -----------------------------
  631.  
  632. We begin by supposing that we have a b-bit message as input, and
  633. that we wish to find its message digest.  Here b is an arbitrary
  634. nonnegative integer; b may be zero, it need not be a multiple of 8,
  635. and it may be arbitrarily large. We imagine the bits of the message
  636. written down as follows:
  637.  
  638.     m_0 m_1 ... m_{b-1} .
  639.  
  640. The following five steps are performed to compute the message digest of the
  641. message.
  642.  
  643.  
  644. Step 1. Append padding bits
  645. ---------------------------
  646.  
  647. The message is ``padded'' (extended) so that its length (in bits) is
  648. congruent to 448, modulo 512.  That is, the message is extended so
  649. that it is just 64 bits shy of being a multiple of 512 bits long.
  650. Padding is always performed, even if the length of the message is
  651. already congruent to 448, modulo 512 (in which case 512 bits of
  652. padding are added).
  653.  
  654. Padding is performed as follows: a single ``1'' bit is appended to the
  655. message, and then enough zero bits are appended so that the length in bits
  656. of the padded message becomes congruent to 448, modulo 512.
  657.  
  658.  
  659. Step 2. Append length
  660. ---------------------
  661.  
  662. A 64-bit representation of b (the length of the message before the
  663. padding bits were added) is appended to the result of the previous
  664. step.  In the unlikely event that b is greater than 2^64, then only
  665. the low-order 64 bits of b are used.  (These bits are appended as two
  666. 32-bit words and appended low-order word first in accordance with the
  667. previous conventions.)
  668.  
  669. At this point the resulting message (after padding with bits and with
  670. b) has a length that is an exact multiple of 512 bits.  Equivalently,
  671. this message has a length that is an exact multiple of 16 (32-bit)
  672. words.  Let M[0 ... N-1] denote the words of the resulting message,
  673. where N is a multiple of 16.
  674.  
  675.  
  676. Step 3. Initialize MD buffer
  677. ----------------------------
  678.  
  679. A 4-word buffer (A,B,C,D) is used to compute the message digest.  Here
  680. each of A,B,C,D are 32-bit registers.  These registers are initialized
  681. to the following values (in hexadecimal, low-order bytes first):
  682.  
  683.     word A:    01 23 45 67
  684.     word B:    89 ab cd ef
  685.     word C:    fe dc ba 98
  686.     word D:    76 54 32 10
  687.  
  688.  
  689. Step 4. Process message in 16-word blocks
  690. -----------------------------------------
  691.  
  692. We first define three auxiliary functions that each take as input
  693. three 32-bit words and produce as output one 32-bit word.
  694.  
  695.     f(X,Y,Z)  =  XY v not(X)Z 
  696.     g(X,Y,Z)  =  XY v XZ v YZ 
  697.     h(X,Y,Z)  =  X xor Y xor Z 
  698.  
  699. In each bit position f acts as a conditional: if x then y else z.
  700. (The function f could have been defined using + instead of v since XY
  701. and not(X)Z will never have 1's in the same bit position.)  In each
  702. bit position g acts as a majority function: if at least two of x, y, z
  703. are on, then g has a one in that bit position, else g has a zero. It
  704. is interesting to note that if the bits of X, Y, and Z are independent
  705. and unbiased, the each bit of f(X,Y,Z) will be independent and
  706. unbiased, and similarly each bit of g(X,Y,Z) will be independent and
  707. unbiased.  The function h is the bit-wise ``xor'' or ``parity'' function;
  708. it has properties similar to those of f and g.
  709.  
  710. Do the following:
  711.  
  712. For i = 0 to N/16-1 do    /* process each 16-word block */
  713.     For j = 0 to 15 do: /* copy block i into X */
  714.       Set X[j] to M[i*16+j].
  715.     end /* of loop on j */
  716.     Save A as AA, B as BB, C as CC, and D as DD.
  717.  
  718.     [Round 1]
  719.       Let [A B C D i s] denote the operation
  720.         A = (A + f(B,C,D) + X[i]) <<< s  .
  721.       Do the following 16 operations:
  722.         [A B C D 0 3] 
  723.         [D A B C 1 7] 
  724.         [C D A B 2 11] 
  725.         [B C D A 3 19] 
  726.         [A B C D 4 3] 
  727.         [D A B C 5 7] 
  728.         [C D A B 6 11] 
  729.         [B C D A 7 19] 
  730.         [A B C D 8 3] 
  731.         [D A B C 9 7] 
  732.         [C D A B 10 11] 
  733.         [B C D A 11 19] 
  734.         [A B C D 12 3] 
  735.         [D A B C 13 7] 
  736.         [C D A B 14 11] 
  737.         [B C D A 15 19] 
  738.  
  739.     [Round 2]
  740.       Let [A B C D i s] denote the operation
  741.             A = (A + g(B,C,D) + X[i] + 5A827999) <<< s .
  742.       (The value 5A..99 is a hexadecimal 32-bit constant, written with
  743.       the high-order digit first. This constant represents the square
  744.       root of 2.  The octal value of this constant is 013240474631.
  745.           See Knuth, The Art of Programming, Volume 2
  746.       (Seminumerical Algorithms), Second Edition (1981), Addison-Wesley.
  747.       Table 2, page 660.)
  748.       Do the following 16 operations:
  749.         [A B C D 0  3] 
  750.         [D A B C 4  5] 
  751.         [C D A B 8  9] 
  752.         [B C D A 12 13] 
  753.         [A B C D 1  3] 
  754.         [D A B C 5  5] 
  755.         [C D A B 9  9] 
  756.         [B C D A 13 13] 
  757.         [A B C D 2  3] 
  758.         [D A B C 6  5] 
  759.         [C D A B 10 9] 
  760.         [B C D A 14 13] 
  761.         [A B C D 3  3] 
  762.         [D A B C 7  5] 
  763.         [C D A B 11 9] 
  764.         [B C D A 15 13] 
  765.  
  766.     [Round 3]
  767.       Let [A B C D i s] denote the operation
  768.         A = (A + h(B,C,D) + X[i] + 6ED9EBA1) <<< s
  769.       (The value 6E..A1 is a hexadecimal 32-bit constant, written with
  770.       the high-order digit first. This constant represents the square
  771.       root of 3.  The octal value of this constant is 015666365641.
  772.           See Knuth, The Art of Programming, Volume 2
  773.       (Seminumerical Algorithms), Second Edition (1981), Addison-Wesley.
  774.       Table 2, page 660.)
  775.       Do the following 16 operations:
  776.         [A B C D 0  3] 
  777.         [D A B C 8  9] 
  778.         [C D A B 4  11] 
  779.         [B C D A 12 15] 
  780.         [A B C D 2  3] 
  781.         [D A B C 10 9] 
  782.         [C D A B 6  11] 
  783.         [B C D A 14 15] 
  784.         [A B C D 1  3] 
  785.         [D A B C 9  9] 
  786.         [C D A B 5  11] 
  787.         [B C D A 13 15] 
  788.         [A B C D 3  3] 
  789.         [D A B C 11 9] 
  790.         [C D A B 7  11] 
  791.         [B C D A 15 15] 
  792.  
  793. Then perform the following additions:
  794.         A = A + AA
  795.         B = B + BB
  796.         C = C + CC
  797.         D = D + DD
  798. (That is, each of the four registers is incremented by the value it had
  799. before this block was started.)
  800.  
  801. end /* of loop on i */
  802.  
  803.  
  804. Step 5. Output
  805. --------------
  806.  
  807. The message digest produced as output is A,B,C,D.
  808. That is, we begin with the low-order byte of A, and end with the
  809. high-order byte of D.
  810.  
  811. This completes the description of MD4.  A reference implementation in
  812. C is given in the Appendix.
  813.  
  814.  
  815. III. Extensions
  816. ---------------
  817.  
  818. If more than 128 bits of output are required, then the following
  819. procedure is recommended to obtain a 256-bit output.  (There is no
  820. provision made for obtaining more than 256 bits.)
  821.  
  822. Two copies of MD4 are run in parallel over the input.  The first copy
  823. is standard as described above.  The second copy is modified as follows.
  824.  
  825. The initial state of the second copy is:
  826.     word A:    00 11 22 33
  827.     word B:    44 55 66 77
  828.     word C:    88 99 aa bb
  829.     word D:    cc dd ee ff
  830.  
  831. The magic constants in rounds 2 and 3 for the second copy of MD4 are
  832. changed from sqrt(2) and sqrt(3) to cuberoot(2) and cuberoot(3):
  833.                 Octal        Hex
  834.     Round 2 constant    012050505746    50a28be6 
  835.     Round 3 constant    013423350444    5c4dd124
  836.  
  837. Finally, after every 16-word block is processed (including the last
  838. block), the values of the A registers in the two copies are exchanged.
  839.  
  840. The final message digest is obtaining by appending the result of the
  841. second copy of MD4 to the end of the result of the first copy of MD4.
  842.  
  843.  
  844. IV. Summary
  845. ------------
  846.  
  847. The MD4 message digest algorithm is simple to implement, and provides
  848. a ``fingerprint'' or message digest of a message of arbitrary length.
  849.  
  850. It is conjectured that the difficulty of coming up with two messages
  851. having the same message digest is on the order of 2^64 operations, and
  852. that the difficulty of coming up with any message having a given
  853. message digest is on the order of 2^128 operations.  The MD4 algorithm
  854. has been carefully scrutinized for weaknesses.  It is, however, a
  855. relatively new algorithm and further security analysis is of course
  856. justified, as is the case with any new proposal of this sort.  The
  857. level of security provided by MD4 should be sufficient for
  858. implementing very high security hybrid digital signature schemes based
  859. on MD4 and the RSA public-key cryptosystem.
  860.  
  861. V. Acknowledgements
  862. -------------------
  863.  
  864. I'd like to thank Don Coppersmith, Burt Kaliski, Ralph Merkle, and
  865. Noam Nisan for numerous helpful comments and suggestions.
  866.  
  867.